SurfaceFlinger是GUI系统的核心,本篇将以自底向上的方式对其展开介绍。
硬件层面
Linux 内核提供了统一的famebuffer显示驱动,设备节点/dev/graphics/fb* 或者 /dev/fb*,fb0是第一个显示屏。
HAL层面
HAL即硬件抽象层,Android的各个子系统通常不会直接使用内核驱动,而是由HAL层简介引用底层架构。Android的HAL层提供了Gralloc,包括了fb和gralloc两个设备。前者负责打开内核中的framebuffer,初始化配置;后者则管理帧缓冲去的分配和释放。
在HAL层中还有一个重要的模块 “Composer”,它为厂商自定制“UI合成”提供了接口。Composer的直接使用者是SurfaceFlinger中的HWComposer
Gralloc模块
下面我们就从HAL层来看看Gralloc的结构
1 | hardware\libhardware\include\hardware\gralloc.h |
对于以上的结构体需要注意的是:
1.每一个硬件都有其对应的模块结构,并且该结构的第一个成员必须为hw_module_t结构,该结构是HAL层对硬件的统一抽象。所以每一个硬件模块都要对应一个hw_module_t结构,并且名称必须为HAL_MODULE_INFO_SYM。
1 | hardware\libhardware\include\hardware\hardware.h |
hw_module_t结构用来描述硬件模块的基本信息,如当前的版本,模块Id以及硬件模块对应的打开方法。
Gralloc模块负责管理gralloc设备和fb设备,它是处于HAL层的,向上提供了这个两个设备的功能。其中最主要的两个接口分别为gralloc_device_open和gralloc_alloc。
我们先看gralloc_device_open,这个方法负责打开gralloc或者fb设备的。
1 | //gralloc模块的打开设备方法 |
参数name指定了要打开的模块,Name为GRALLOC_HARDWARE_GPU0说明打开的是GPU,否则打开fb设备。
1 | //对外的分配缓冲区的方法 |
另一个方法gralloc_alloc 负责为上层分配缓冲区,注意这里的缓冲区既可以是内存缓冲区,也可以是fb的帧缓冲区。这分别是通过gralloc_alloc_buffer 和 gralloc_alloc_framebuffer来实现的。在内存中创建缓冲区是基于asheme的方式来创建一块匿名共享内存来作为缓冲区的,而如果是从fb中分配则只需要将fb的帧缓冲区映射到当前进程来即可。具体可以参见famebuffer.cpp中的mapFrameBufferLocked方法。
关于fb设备 其最重要的功能是将上层缓冲区的内容通过交换显示在屏幕上,这个功能是通过fb_post来实现的,在这之前我们看看如何打开fb设备
1 | //打开fb设备 这个方法通过HAL层的Gralloc模块提供给上层接口 |
1 | //将缓冲区的内容显示在屏幕上 |
好了,对于HAL层的模块分析就到这里了,下篇我们介绍下VSYNC信号相关的内容。